package Thread;

//下面这段代码，称为”饿汉模式“，是单例模式中一种简单的写法
//实例在类加载的时候就创建了，创建时机非常早，相当于程序一启动，实例就创建了
//就使用”饿汉“形容创建实例非常迫切，非常早
class Singleton{
    //期望这个类只能有唯一的实例（一个进程中）
    private static Singleton instance=new Singleton();
    //static这个引用就是期望创建出唯一的实例的引用
    //static静态的指的是”类属性“，instance就是Singleton类对象里持有的属性
    //类对象就是.class文件，Singleton.class(从.class文件加载到内存中表示这个类的一个数据结构)
    //每个类的类对象只存在一个，类对象的static属性自然也就只有一个了
    //因此，instance指向的这个对象就是唯一的一个对象
    private Singleton(){
        //构造方法设为私有的，其他代码就没法new了，从根本上让其他代码只能使用getInstance()方法
    }
    public static Singleton getInstance(){
        //其他代码要想使用这个类的实例，就需要通过这个getInstance()方法获取
        //不应该在其他代码中重新new这个对象，而是使用这个方法获取到现成的对象
        return instance;
    }
}
//第一步：先创建好这个实例，通过一个静态成员持有，
//第二步：提供一个静态的public方法，能够获取到刚才那个实例
//第三步：构造方法设为私有，外界没法进行new操作，让编译器真正进入检查之中，避免由于人的约定产生误会
public class ThreadDemo22 {
    public static void main(String[] args) {
        //Singleton s=new Singleton();不能new,会报错
        Singleton s=Singleton.getInstance();
        Singleton s2=Singleton.getInstance();
        System.out.println(s==s2);//true,多次调用也不会产生多个实例，始终是那一个实例

    }
}
//对于”饿汉模式“，getInstance直接返回Instance实例，这个操作本质上是读操作
//多个线程读取同一个变量，线程是安全的